package com.lwj.springbootvue.service.impl;

import java.util.List;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lwj.springbootvue.constants.HttpStatus;
import com.lwj.springbootvue.exception.ServiceException;
import com.lwj.springbootvue.mapper.ClasseMapper;
import com.lwj.springbootvue.model.Classe;
import com.lwj.springbootvue.model.vo.StudentVo;
import com.lwj.springbootvue.service.IClasseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lwj.springbootvue.mapper.StudentMapper;
import com.lwj.springbootvue.model.Student;
import com.lwj.springbootvue.service.IStudentService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 学生Service业务层处理
 * 
 * @author king
 * @date 2024-12-25
 */
@Service
public class StudentServiceImpl implements IStudentService 
{





    @Autowired
    private StudentMapper studentMapper;


    @Autowired
    private ClasseMapper classeMapper;

    @Autowired
    private IClasseService iClasseService;


    /**
     * 查询学生
     *
     * @param sid 学生主键
     * @return 学生
     */
    @Override
    public StudentVo selectStudentBySid(Long sid)
    {
        // 1.先查询出学生信息
        Student student = studentMapper.selectStudentBySid(sid);
        // 2.先根据学生的scid,查询学生的班级，年级信息
        Classe classe = classeMapper.selectClasseByCid(student.getScid());
        // 3.设置学生的班级，和年级信息
        StudentVo studentVo = new StudentVo();
        BeanUtil.copyProperties(student,studentVo);
        studentVo.setClevel(classe.getClevel());
        studentVo.setCname(classe.getCid());

        return studentVo;
    }

    /**
     * 查询学生列表
     * 
     * @param student 学生
     * @return 学生
     */
    @Override
    public List<Student> selectStudentList(Student student)
    {
        // 开启分页
        PageHelper.startPage(Math.toIntExact(student.getPageNum()), Math.toIntExact(student.getPageSize()));// 开启分页
        // pageHelp 会自动分页查询
        return studentMapper.selectStudentList(student);
    }

    /**
     * 查询学生列表 + 班级
     *
     * @param student 学生
     * @return 学生
     */
    @Override
    public PageInfo<StudentVo> selectStudentVoList(Student student) {
        // 开启分页
        PageHelper.startPage(Math.toIntExact(student.getPageNum()), Math.toIntExact(student.getPageSize()));// 开启分页
        // pageHelp 会自动分页查询
        List<StudentVo> studentVos = studentMapper.selectStudentVoList(student);
        PageInfo<StudentVo> pageInfo=new PageInfo<StudentVo>(studentVos);
        return pageInfo;
    }

    /**
     * 新增学生
     * 
     * @param student 学生
     * @return 结果
     */
    @Override
    @Transactional
    public int insertStudent(Student student)
    {
        // 1.统计班级总人数
        int i = studentMapper.insertStudent(student);
        int i1=0;
        if(i>0){
            // 2. 更新班级总人数
                // 查询原本的班级人数
            Classe classe = classeMapper.selectClasseByCid(student.getScid());
            classe.setNum(classe.getNum()+i);
                // 更新班级人数
            i1 = classeMapper.updateClasse(classe);
        }
        if(i1<0){
            throw new ServiceException(HttpStatus.ERROR,"班级人数更新失败！");
        }
        return i1;
    }

    /**
     * 修改学生
     * 
     * @param student 学生
     * @return 结果
     */
    @Override
    @Transactional
    public int updateStudent(Student student)
    {
        int i = studentMapper.updateStudent(student);
        if(i>0){
            return i;
        }
        // 更新班级总人数
        int i1 = iClasseService.updateClasseNumByScid();
        if(i1==1){
            return i1;
        }
        // 更新失败
        throw new ServiceException(HttpStatus.ERROR,"更新班级人数失败！");
    }

    /**
     * 批量删除学生
     * 
     * @param sids 需要删除的学生主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteStudentBySids(Long[] sids)
    {
        for(Long sid : sids){
                // 1. 删除学生时，班级总数减少
                Student student = studentMapper.selectStudentBySid(sid);
                // 2. 查询学生所属班级
                Classe classe = classeMapper.selectClasseByCid(student.getScid());
                // 如果学生已经绑定班级，班级总人数减一
                if(ObjectUtil.isNotNull(classe)){
                    // 所属的班级总人数 减一
                    classe.setNum(classe.getNum() - 1);
                    classeMapper.updateClasse(classe);
                }
                int deleteCount = studentMapper.deleteStudentBySid(sid);
                if (deleteCount != 1) {
                    // 处理学生删除失败的情况
                    throw new ServiceException(HttpStatus.ERROR,"删除学生失败" + sid);
                }
        }
        // 1.同步班级总人数
        return studentMapper.deleteStudentBySids(sids);
    }

    /**
     * 删除学生信息
     * 
     * @param sid 学生主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteStudentBySid(Long sid)
    {
            // 1. 删除学生时，班级总数减少
            Student student = studentMapper.selectStudentBySid(sid);

            // 2. 查询学生所属班级
            Classe classe = classeMapper.selectClasseByCid(student.getScid());
            if (ObjectUtil.isNotNull(classe)) {
                // 所属的班级总人数 减一
                classe.setNum(classe.getNum() - 1);
                classeMapper.updateClasse(classe);
            }
            // 删除学生
            int deleteCount = studentMapper.deleteStudentBySid(sid);
            if (deleteCount != 1) {
                // 处理学生删除失败的情况
                throw new ServiceException(HttpStatus.ERROR,"删除学生失败" + sid);
            }
            return deleteCount;
    }
}
